/*->c.timex */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>

#include "h.os"
#include "h.bbc"
#include "h.wimp"

#include "h.swis"

#include "h.def"
#include "h.wos"

#include "h.ram"

#include "h.timex"

/*****************************************************************************/


int monotonic(void)
{
 os_regset rx;
 os_swix(OS_ReadMonotonicTime,&rx);
 return(rx.r[0]);
}



/* get current time */

void getcurtime(arctime * time)
{
 os_error * errpoi;
 char       pblk[32];

 pblk[0]=3;
 errpoi=os_word(14,pblk);

 time->lo=*(unsigned int *)pblk;
 time->hi=pblk[4];
}



int filetime(fstat * f,arctime * t)
{
 if((f->load & 0xFFF00000)==0xFFF00000)   /* has time stamp */
 {
  t->lo=f->exec;
  t->hi=f->load & 0xFF;
  return(1);
 }
 else
  return(0);
}



/* gets time stamp for file either from disc or clock */

void gettime(char * filename,FILE * fp,arctime * time)
{
 fstat           f;
 os_error * errpoi;

 if(fp && !ramfp(fp))
 {
  errpoi=stat(filename,&f);
  if(!errpoi && filetime(&f,time)) return;
 }
 getcurtime(time);
}


/* return -1 f1<f2 1 if f1>f2 else 0 */

int cmptimes(fstat * f1,fstat * f2)
{
 arctime t1;
 arctime t2;
 int     t1true;
 int     t2true;

 t1true=filetime(f1,&t1);
 t2true=filetime(f2,&t2);

 if(!t1true && !t2true) return(0);
 else
 if(!t1true)            return(-1);
 else
 if(!t2true)            return(1);

 if(t1.hi==t2.hi)
 {
  if(t1.lo>t2.lo) return(1);
  else            return(-1);
 }
 else
 if(t1.hi>t2.hi) return(1);
 else            return(-1);
}



int difftimes(arctime * t1,arctime * t2)
{
 unsigned int result;

 result=t1->lo-t2->lo;

 return((int)result);
}


void writets(char * string,char * format,arctime * timex)
{
 char pblk[32];
 os_regset rx;

 *(unsigned int *)pblk=timex->lo;
 pblk[4]=timex->hi;

 rx.r[0]=(int)pblk;
 rx.r[1]=(int)string;
 rx.r[2]=64;
 rx.r[3]=(int)format;

 os_swix(OS_ConvertDateAndTime,&rx);
}



void writedate(char * string,arctime * timex)
{
 writets(string,"%ZDY %M3 %YR%0",timex);
}


void writetime(char * string,arctime * timex)
{
 writets(string,"%Z12:%MI%AM%0",timex);
}



void writetimedate(char * string,arctime * timex)
{
 writets(string,"%24:%MI:%SE %DY %M3 %YR%0",timex);
}


void getsysdate(char * format,int d,int t)
{
 char dstring[64];
 char tstring[64];

 strcpy(dstring,"%ZDY %M3 %YR");
 strcpy(tstring,"%Z12:%MI%AM");

 if(getenv("Hearsay$DateFormat"))
                     strcpy(dstring,getenv("Hearsay$DateFormat"));
 if(getenv("Hearsay$TimeFormat"))
                     strcpy(tstring,getenv("Hearsay$TimeFormat"));

 if(d && t) sprintf(format,"%s %s%%0",tstring,dstring);
 else
 if(t)      sprintf(format,"%s%%0",tstring);
 else       sprintf(format,"%s%%0",dstring);
}



void writesysst(char * string,int d,int t)
{
 arctime timex;
 char format[64];

 getcurtime(&timex);
 getsysdate(format,d,t);
 writets(string,format,&timex);
}



void writesystime(char * string)
{
 writesysst(string,0,1);
}



void writesysdate(char * string)
{
 writesysst(string,1,0);
}


void writesystimedate(char * string)
{
 writesysst(string,1,1);
}


void writefiletime(char * string,fstat * stat)
{
 arctime t;

 if(filetime(stat,&t))
   writetimedate(string,&t);
 else
   strcpy(string,"");
}


void writehms(char * str,int time)
{
 time=time/100;
 sprintf(str,"%02d:%02d:%02d",(time/3600) % 24,(time/60) % 60,time % 60);
}

